package com.agile.springboot.controller;

import com.agile.springboot.common.Result;
import com.agile.springboot.entity.Questionnaire;
import com.agile.springboot.entity.User;
import com.agile.springboot.service.QuestionnaireService;
import com.agile.springboot.service.UserService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/questionnaire")
public class QuestionnaireController {

    @Resource
    QuestionnaireService questionnaireService;
    @Resource
    UserService userService;

    /**
     * 新增问卷
     * @param questionnaire 信息尽可能完整
     * @return 结果相关信息
     */
    @PostMapping("/addQuestionnaire")
    public Result<?> addQuestionnaire(@RequestBody Questionnaire questionnaire) {
        if (questionnaireService.addQuestionnaire(questionnaire) == 1) {
            return Result.success(questionnaire, "添加问卷成功!");
        }
        return Result.error("-1", "添加问卷失败!");
    }

    /**
     * 逻辑删除问卷
     * @param questionnaire 问卷实体
     * 所必须的参数为问卷 id 属性
     * @return 结果相关信息
     */
    @PostMapping("/deleteQuestionnaire")
    public Result<?> deleteQuestionnaire(@RequestBody Questionnaire questionnaire) {
        Questionnaire delQuestionnaire = questionnaireService.searchQuestionnaireById(questionnaire.getId());
        if (delQuestionnaire.getQuestion_status() != 1) {
            questionnaireService.deleteQuestionnaire(questionnaire.getId());
            return Result.success(questionnaire.getId(), "删除问卷成功!");
        } else {
            return Result.error("-1", "问卷进行中，删除失败!");
        }
    }

    /**
     * 物理删除问卷
     * @param questionnaire 问卷实体
     * 所必须的参数为问卷 id 属性
     * @return 结果相关信息
     */
    @PostMapping("/pscDeleteQuestionnaire")
    public Result<?> pscDeleteQuestionnaire(@RequestBody Questionnaire questionnaire) {
        Questionnaire delQuestionnaire = questionnaireService.searchQuestionnaireById(questionnaire.getId());
        if (delQuestionnaire.getQuestion_status() != 1) {
            questionnaireService.pscDeleteQuestionnaire(questionnaire.getId());
            return Result.success(questionnaire.getId(), "删除问卷成功！");
        } else {
            return Result.error("-1", "问卷进行中，删除失败!");
        }
    }

    /**
     * 修改问卷信息
     * @param questionnaire 信息尽可能完整
     * 所必须的参数为问卷 id 属性，且至少传入一个其它非空参数
     * @return 结果相关信息
     */
    @PostMapping("/updateQuestionnaire")
    public Result<?> updateQuestionnaire(@RequestBody Questionnaire questionnaire) {
        Questionnaire updateQuestionnaire = questionnaireService.searchQuestionnaireById(questionnaire.getId());
        if (updateQuestionnaire.getQuestion_status() != 1) {
            questionnaireService.updateQuestionnaire(questionnaire);
            return Result.success(questionnaire, "修改问卷信息成功!");
        } else {
            return Result.error("-1", "问卷进行中，无法修改!");
        }
    }

    /**
     * 模糊搜索问卷
     * @param questionnaire 问卷实体
     * 所必须的参数为 questionnaire_title 问卷名称属性
     * @return 结果相关信息
     */
    @PostMapping("/fuzzySearchQuestionnaire")
    public Result<?> fuzzySearchQuestionnaire(@RequestBody Questionnaire questionnaire) {
        List<Questionnaire> questionnaireList = questionnaireService.fuzzySearchQuestionnaireByTitle(questionnaire.getQuestionnaire_title());
        if (!questionnaireList.isEmpty()) {
            return Result.success(questionnaireList, "查找问卷成功!");
        }
        return Result.error("-1", "无相关问卷！");
    }

    /**
     * 精准搜索问卷——根据用户名称
     * @param questionnaire 问卷实体
     * 所必须的参数为 questionnaire_title 问卷名称属性
     * @return 结果相关信息
     */
    @PostMapping("/exactSearchQuestionnaireByTitle")
    public Result<?> exactSearchQuestionnaireByTitle(@RequestBody Questionnaire questionnaire) {
        Questionnaire questionnaireFind = questionnaireService.exactSearchQuestionnaireByTitle(questionnaire.getQuestionnaire_title());
        if (questionnaireFind != null) {
            return Result.success(questionnaireFind, "查找问卷成功！");
        }
        return Result.error("-1", "无此问卷！");
    }

    /**
     * 精准搜索问卷——根据问卷id
     * @param questionnaire 问卷实体
     * 所必须的参数为问卷 id
     * @return 结果相关信息
     */
    @PostMapping("/searchQuestionnaireById")
    public Result<?> searchQuestionnaireById(@RequestBody Questionnaire questionnaire) {
        Questionnaire questionnaireFind = questionnaireService.searchQuestionnaireById(questionnaire.getId());
        if (questionnaireFind != null) {
            return Result.success(questionnaireFind, "查找问卷成功！");
        }
        return Result.error("-1", "无此问卷！");
    }

    /**
     * 查询当前用户创建的所有问卷——根据当前用户id
     * @param user 用户实体
     * 所必须的参数为 id 用户的id
     * @return 结果相关信息和 List<Questionnaire> 用户创建的所有问卷
     */
    @PostMapping("/queryQuestionnairesCreatedByUser")
    public Result<?> queryQuestionnairesCreatedByUser(@RequestBody User user){
        User the_user = userService.searchUserById(user.getId());
        if(the_user==null){
            return Result.error("0","不存在此用户id!");
        }
        if(the_user.getIdentity()==2){//辨别用户身份是否为用户
            List<Questionnaire> questionnaireList = questionnaireService.queryQuestionnairesCreatedByUser(the_user.getId());//查询当前用户创建的问卷
            if(questionnaireList.size()!=0){
                return Result.success(questionnaireList,"查询成功！");
            }else{
                return Result.error("-1","该用户没有创建过问卷！");
            }
        }else {
            return Result.error("-2","该用户不是用户！");
        }
    }

    /**
     * 根据问卷名在用户创建的所有问卷里面进行模糊搜索
     * @param questionnaire
     * 所必须的参数为 user_id 用户的id 和 questionnaire_title 问卷名
     * @return 结果相关信息和 List<Questionnaire> 符合title条件的用户创建的所有问卷
     */
    @PostMapping("/fuzzySearchByTitleInQuestionnairesCreatedByUser")
    public Result<?> fuzzySearchByTitleInQuestionnairesCreatedByUser(@RequestBody Questionnaire questionnaire){
        //查询当前用户创建的所有问卷
        List<Questionnaire> questionnaireList = questionnaireService.queryQuestionnairesCreatedByUser(questionnaire.getUser_id());
        List<Questionnaire> result = new ArrayList<>();//存储title符合条件的问卷
        for(Questionnaire theQuestionnaire : questionnaireList){
            //判断当前问卷的问卷名是否包含所输入的文字，如果包含则将其视为符合title条件的问卷
            if(theQuestionnaire.getQuestionnaire_title().contains(questionnaire.getQuestionnaire_title())){
                result.add(theQuestionnaire);
            }
        }
        if(result.size()==0){
            return Result.error("-1","无相关问卷！");
        }else{
            return Result.success(result,"查询成功!");
        }
    }

    /**
     * 提交问卷，将问卷状态更改为已完成：2
     * @param questionnaire
     * 所必须的参数为问卷 id
     * @return 结果相关信息
     */
    @PostMapping("/QuestionnaireToFinish")
    public Result<?> QuestionnaireToFinish(@RequestBody Questionnaire questionnaire){
        Questionnaire updateQuestionnaire = questionnaireService.searchQuestionnaireById(questionnaire.getId());
        if(updateQuestionnaire.getQuestion_status()==0){
            return Result.error("-1","该问卷还为发布，无法提交！");
        }else if(updateQuestionnaire.getQuestion_status()==2){
            return Result.error("-2","该问卷已完成，无法重复提交！");
        }else{
            updateQuestionnaire.setQuestion_status(2);//重新设置问卷状态
            if(questionnaireService.updateQuestionnaire(updateQuestionnaire)==1){//更新问卷信息
                return Result.success(questionnaire, "问卷提交成功！");
            }else{
                return Result.error("-1","问卷提交失败");
            }
        }
    }

    /**
     * 获取的所该领域类型下的所有问卷——根据领域类型
     * @param questionnaire 问卷实体
     * 所必须的参数为 domain_type 问卷的领域类型
     * @return 结果相关信息和 List<Questionnaire> 该领域类型下的所有问卷
     */
    @PostMapping("/getQuestionnairesByDomainType")
    public Result<?> getQuestionnairesByDomainType(@RequestBody Questionnaire questionnaire){
        List<Questionnaire> questionnaireList = questionnaireService.getQuestionnairesByDomainType(questionnaire.getDomain_type());
        if (!questionnaireList.isEmpty()) {
            return Result.success(questionnaireList, "获取问卷成功!");
        }
        return Result.error("-1", "无该领域类型的问卷！");
    }
}
